package com.binc.testspring.study.nio.netty.protocoltcp;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * FileName: MyByteToLongDecoder
 * Autho: binC
 * Date:  2022/4/21 14:32
 */
public class MyMessageProtocolDecoder1 extends ByteToMessageDecoder {

    /**
     * 这里的任务就是将得到的 字节码数据  转换成   MessageProtocol自定义协议包对象
     * @param ctx
     * @param in
     * @param out
     * @throws Exception
     */
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        System.out.println("自定义协议包 的  自定义解码器 的decode 方法被调用");
        MessageProtocol decoded = this.localDecode(ctx, in);

        if (decoded != null) {
            out.add(decoded);  // 如果有东西就添加进去,如果没有(半包),不做处理,等下一个消息连起来一起处理
        }


    }

    private MessageProtocol localDecode(ChannelHandlerContext ctx, ByteBuf in) {
        if (in.readableBytes() < 4) {
            //先判断是否满足自定义协议包中 len的长度    这个长度都不够,明显是半包了
            return null;
        }
         in.markReaderIndex();
        int len = in.readInt();
        if (in.readableBytes()< len) {
            // 复位 并返回
            in.resetReaderIndex();
            return null;
        }
        byte[] bytes  = new byte[len];
        in.readBytes(bytes);

        MessageProtocol messageProtocol = new MessageProtocol();
        messageProtocol.setLen(len);
        messageProtocol.setContent(bytes);
        return  messageProtocol;


    }
}
